package ink.liaoxuefeng.threaddemo.demo01;

/**
 * @author wangzhuangzhuang
 * @Description:
 * @date 2022-06-02 13:25
 */
public class TestDemo09 {
	public static void main(String[] args) throws InterruptedException {
		StopThreadByFlag t = new StopThreadByFlag();
		t.start();
		Thread.sleep(10);
		t.running = false;
	}
}

class StopThreadByFlag extends Thread {
	public volatile boolean running = true;

	/**
	 * volatile作用：
	 * 1. 轻量级同步效果
	 * 2. 防止指令重排序
	 */
	public void run() {
		int n = 0;
		while(running){
			n ++;
			System.out.println(n + " hello! ");
		}
		System.out.println("end!");
	}
}

/*
 * StopThreadByFlag的标志位 boolean running是一个线程间共享的变量。
 *
 * 线程间共享变量需要使用 volatile 关键字标记。
 *
 * 确保每个线程都能读取到更新后的变量值。
 *
 * 为什么要对线程间共享的变量用关键字 volatile 声明？
 *
 * */


/*
 HelloThread的标志位 boolean running是一个线程间共享的变量
 线程间共享变量需要使用volatile关键字标记，确保每个线程都能读取到更新后的变量值

 为什么要对线程间共享的变量用关键字volatile声明 ？
 变量的值保存在主内存中，但是，当线程访问变量时，会先获取一个副本，并保存在自己的工作内存中
 如果线程修改了变量的值，虚拟机会在某个时刻把修改后的值回写到主内存，但是时间不确定
* **/